package com.companyName.sample.common.util;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;

/**
 * Created by guo.jun on 2016/4/5.
 */
public class BeanValidation {

    /*
    Bean Validation 中的 constraint
     表 1. Bean Validation 中内置的 constraint
     Constraint	详细信息
     @Null	被注释的元素必须为 null
     @NotNull	被注释的元素必须不为 null
     @AssertTrue	被注释的元素必须为 true
     @AssertFalse	被注释的元素必须为 false
     @Min(value)	被注释的元素必须是一个数字，其值必须大于等于指定的最小值
     @Max(value)	被注释的元素必须是一个数字，其值必须小于等于指定的最大值
     @DecimalMin(value)	被注释的元素必须是一个数字，其值必须大于等于指定的最小值
     @DecimalMax(value)	被注释的元素必须是一个数字，其值必须小于等于指定的最大值
     @Size(max, min)	被注释的元素的大小必须在指定的范围内
     @Digits (integer, fraction)	被注释的元素必须是一个数字，其值必须在可接受的范围内
     @Past	被注释的元素必须是一个过去的日期
     @Future	被注释的元素必须是一个将来的日期
     @Pattern(value)	被注释的元素必须符合指定的正则表达式
     表 2. Hibernate Validator 附加的 constraint
     Constraint	详细信息
     @Email	被注释的元素必须是电子邮箱地址
     @Length	被注释的字符串的大小必须在指定的范围内
     @NotEmpty	被注释的字符串的必须非空
     @Range	被注释的元素必须在合适的范围内
 */
    public static String validate(Object bean){
        StringBuffer msg = new StringBuffer();
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator =  factory.getValidator();
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(bean);
        if(!constraintViolations.isEmpty()) {
            for (ConstraintViolation<Object> constraintViolation : constraintViolations) {
                msg.append("[");
                msg.append(constraintViolation.getPropertyPath().toString());
                msg.append(":");
                msg.append(constraintViolation.getMessage());
                msg.append("]");
            }
        }
        return msg.toString();
    }
}
